home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / lists / mint / l_1199 / 1067 < prev    next >
Encoding:
Internet Message Format  |  1994-08-27  |  5.7 KB

  1. From: Stephen Usher <Stephen.Usher@earth.ox.ac.uk>
  2. Subject: load average patches for MiNT 1.10 + patches
  3. Date: Tue, 22 Feb 1994 21:35:25 +0000 (GMT)
  4. Mime-Version: 1.0
  5.  
  6. Here's the latest version of my uptime and load average patch for MiNT. The
  7. patch is relative to version 1.10 with most of the patches from the last
  8. week added.
  9.  
  10. This version now uses the 200Hz interrupt for timing so should keep the
  11. correct time on any machine with whatever monitor. The patches affect dos.c,
  12. intr.spp and proc.c and adds loadave.h. I'm also including below definitions
  13. for mintbind.h.
  14.  
  15. By the way, this gives MiNT a 1 second internal timer event if anyone wants
  16. to use it.
  17.  
  18. The load averages themselves are unsigned longs which have to be divided by
  19. 2048 to give the correct average. ie.
  20.  
  21.     load average = value / 2048
  22.  
  23. The returned uptime is in seconds since boot.
  24.  
  25. Steve
  26.  
  27. <-- mintbind.h -->
  28.  
  29. long Suptime(unsigned long *uptime, unsigned long loadaverage[3]);
  30. /* GEMDOS 0x13f */
  31. #define Suptime(uptime, avenrun)                \
  32.         trap_1_wll(0x13f, (long)(uptime), (long)(avenrun))
  33.  
  34. Here come the patches...
  35. *** ../mint.pchd/loadave.h    Tue Feb 22 20:47:58 1994
  36. --- loadave.h    Mon Feb 21 21:50:00 1994
  37. ***************
  38. *** 0 ****
  39. --- 1,11 ----
  40. + #define TICKS_PER_TOCK        200
  41. + #define TOCKS_PER_SECOND    1
  42. + #define SAMPS_PER_MIN    12
  43. + #define SAMPS_PER_5MIN    SAMPS_PER_MIN * 5
  44. + #define SAMPS_PER_15MIN    SAMPS_PER_MIN * 15
  45. + #define LOAD_SCALE 2048
  46. + extern unsigned long uptime;
  47. + extern unsigned long avenrun[3];
  48. *** ../mint.pchd/dos.c    Tue Feb 22 20:42:24 1994
  49. --- dos.c    Mon Feb 21 21:52:52 1994
  50. ***************
  51. *** 468,473 ****
  52. --- 468,493 ----
  53.   }
  54.   
  55.   /*
  56. +  * Suptime: get time in seconds since boot and current load averages from
  57. +  * kernel.
  58. +  */
  59. + #include "loadave.h"
  60. + long ARGS_ON_STACK
  61. + s_uptime(cur_uptime, loadaverage)
  62. +     unsigned long *cur_uptime;
  63. +     unsigned long loadaverage[3];
  64. + {
  65. +     *cur_uptime = uptime;
  66. +     loadaverage[0] = avenrun[0];
  67. +     loadaverage[1] = avenrun[1];
  68. +     loadaverage[2] = avenrun[2];
  69. +     return 0;
  70. + }
  71. + /*
  72.    * routine for initializing DOS
  73.    *
  74.    * NOTE: before adding new functions, check the definition of
  75. ***************
  76. *** 601,604 ****
  77. --- 621,625 ----
  78.       dos_tab[0x13c] = s_alert;
  79.       dos_tab[0x13d] = t_malarm;
  80.       dos_tab[0x13e] = p_sigintr;
  81. +     dos_tab[0x13f] = s_uptime;
  82.   }
  83. *** ../mint.pchd/intr.spp    Tue Feb 22 20:42:50 1994
  84. --- intr.spp    Mon Feb 21 22:27:40 1994
  85. ***************
  86. *** 35,43 ****
  87. --- 35,52 ----
  88.       XREF    _preempt
  89.       XREF    _in_kernel
  90.   
  91. +     XREF    _calc_load_average
  92. +     XREF    _uptimetick
  93.   ; AKP: this code is hit once every 5ms; it updates the time fields of curproc.
  94.   _mint_5ms:
  95.       move.l    a0,-(sp)
  96. +     tst.l    _uptimetick
  97. +     bne.s    L_no_uptime
  98. +     jsr    L_uptime_update
  99. + L_no_uptime:
  100. +     lea    _uptimetick,a0
  101. +     subq.l    #1,(a0)
  102.       move.l    _curproc,a0
  103.       tst.w    _in_kernel
  104.       bne.s    L_systime
  105. ***************
  106. *** 53,58 ****
  107. --- 62,72 ----
  108.       move.l    _old_5ms+8,-(sp)
  109.       rts
  110.   
  111. + L_uptime_update:
  112. +     movem.l    d0-d2/a0-a2,-(sp)    ; save C registers
  113. +     jsr    _calc_load_average
  114. +     movem.l    (sp)+,d0-d2/a0-a2
  115. +     rts
  116.   _mint_timer:
  117.       movem.l    d0-d2/a0-a2,-(sp)    ; save C registers
  118.       jsr    _timeout
  119. *** ../mint.pchd/proc.c    Tue Feb 22 20:42:28 1994
  120. --- proc.c    Mon Feb 21 22:24:18 1994
  121. ***************
  122. *** 655,660 ****
  123. --- 655,672 ----
  124.   #define qname(x) ((x >= 0 && x < NUM_QUEUES) ? qstring[x] : "unkn")
  125.   #endif
  126.   
  127. + #include "loadave.h"
  128. + unsigned long uptime = 0;
  129. + unsigned long avenrun[3] = {0,0,0};
  130. + unsigned long uptimetick;
  131. + unsigned long number_running;
  132. + unsigned long one_min_ptr = 0, five_min_ptr = 0, fifteen_min_ptr = 0;
  133. + unsigned long sum1 = 0, sum5 = 0, sum15 = 0;
  134. + unsigned char one_min[SAMPS_PER_MIN];
  135. + unsigned char five_min[SAMPS_PER_5MIN];
  136. + unsigned char fifteen_min[SAMPS_PER_15MIN];
  137.   void
  138.   DUMPPROC()
  139.   {
  140. ***************
  141. *** 661,666 ****
  142. --- 673,683 ----
  143.   #ifdef DEBUG_INFO
  144.       PROC *p = curproc;
  145.   
  146. +     FORCE("Uptime: %ld seconds Loads: %ld %ld %ld Processes running: %ld",
  147. +         uptime,
  148. +         (avenrun[0]*100)/2048 , (avenrun[1]*100)/2048, (avenrun[2]*100/2048),
  149. +          number_running);
  150.       for (curproc = proclist; curproc; curproc = curproc->gl_next) {
  151.           FORCE("state %s PC: %lx BP: %lx",
  152.           qname(curproc->wait_q),
  153. ***************
  154. *** 669,672 ****
  155. --- 686,747 ----
  156.       }
  157.       curproc = p;        /* restore the real curproc */
  158.   #endif
  159. + }
  160. + unsigned long gen_average(sum, cur_load, load_array, ptr, max_size)
  161. + long *sum;
  162. + unsigned long cur_load;
  163. + unsigned char load_array[];
  164. + unsigned long ptr;
  165. + int max_size;
  166. + {
  167. +     unsigned long retval;
  168. +     long old_load, new_load;
  169. +     old_load = (long)load_array[ptr];
  170. +     new_load = (long)cur_load;
  171. +     load_array[ptr] = (char)new_load; 
  172. +     *sum += ((new_load - old_load) * LOAD_SCALE);
  173. +     retval = (unsigned long)(*sum / max_size);
  174. +     return retval;
  175. + }
  176. + void calc_load_average()
  177. + {
  178. +     PROC *p;
  179. +     uptime++;
  180. +     uptimetick = 200;
  181. +     if (uptime % 5) return;
  182. +     number_running = 0;
  183. +     
  184. +     for (p = proclist; p; p = p->gl_next)
  185. +         if (p != rootproc)
  186. +             if ((p->wait_q == 0) || (p->wait_q == 1))
  187. +                 number_running++;
  188. +     avenrun[0] = gen_average(&sum1, number_running,
  189. +         one_min, one_min_ptr++, SAMPS_PER_MIN);
  190. +     if (one_min_ptr == SAMPS_PER_MIN)
  191. +         one_min_ptr = 0;
  192. +     avenrun[1] = gen_average(&sum5, number_running,
  193. +         five_min, five_min_ptr++, SAMPS_PER_5MIN);
  194. +     if (five_min_ptr == SAMPS_PER_5MIN)
  195. +         five_min_ptr = 0;
  196. +     avenrun[2] = gen_average(&sum15, number_running,
  197. +         fifteen_min, fifteen_min_ptr++, SAMPS_PER_15MIN);
  198. +     if (fifteen_min_ptr == SAMPS_PER_15MIN)
  199. +         fifteen_min_ptr = 0;
  200.   }
  201.  
  202. -- 
  203. ---------------------------------------------------------------------------
  204. Computer Systems Administrator, Dept. of Earth Sciences, Oxford University.
  205. E-Mail: steve@uk.ac.ox.earth (JANET) steve@earth.ox.ac.uk (Internet).
  206. Tel:- Oxford (0865) 282110 (UK) or +44 865 282110 (International).
  207.